iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
Web 3

從 區塊鏈 到 去中心化應用程式(DApp)系列 第 10

區塊鏈建立: 開始建立區塊鏈

  • 分享至 

  • xImage
  •  

區塊鏈的建立

根據區塊鏈的歷史
區塊鏈的基礎概念 可以溯源到很早的時候

不過當時之所以沒有運行起來
便是因為尚有一些難題未解決(包括 共識機制、去中心化等等)

而現在看區塊鏈型似乎是件很自然的事
因此就是必須要 實際區搭建一個區塊鏈 方能理解其中的困難處

為此 創建區塊鏈必須實現的功能

  1. 節點的建立
  2. 傳輸資料時的方式與協定
  3. 資料庫的應用與規劃
  4. 區塊計算
  5. 提供上傳交易的接口

最後再根據以上資訊 建立

  • 系統架構規劃

節點的建立

首先 我們必須知道

區塊鏈網路是 點對點(P2P)

因此如上圖展示一般 每個節點都是公平的且能互相傳輸訊息

節點的作用是甚麼?

  1. 連上已存在區塊鏈網上的節點 並加入成為節點
  2. 跟舊有節點詢問歷史區塊資料 並更新自己的區塊紀錄
  3. 接收廣播或是外部交易 進行內部確認 再廣播交易給其他節點
  4. 接收區塊 驗證並更新資料庫 再廣播區塊給其他節點
  5. 計算完成區塊 驗證並更新資料庫 再廣播區塊給其他節點
  6. 最後接收其他節點的連線 並重複上述過程

節點必須存在的功能

  • 連接舊有節點
  • 接收新節點連線
  • 從舊有節點獲得歷史區塊資訊
  • 對於確認交易 對連接的節點 進行傳輸(廣播)
  • 對於確認區塊 對連接的節點 進行傳輸(廣播)
  • 接受外部交易請求
  • 接受外部查詢請求

傳輸資料時的方式與協定

由於是 點對點(P2P) 網路架構

因此會希望 是屬於長連線
能隨時回應資訊 與 隨時主動傳遞資訊
並且希望內容正確不要遺失最好

所以綜合上面需求 該建立基於 TCP 之上的協定

接下來再看到 關於一個節點 在區塊鏈中 所需要的詳細功能

由上圖 可以看到有很多種傳輸內容

在後面的篇章會為每一個傳輸內容界定格式
(每個傳過去的物件要有甚麼屬性之類的)

並且界定成功與否的狀態還有相對解決方法

資訊出發節點 資訊接收節點
歷史區塊詢問 詢問歷史區塊 回傳給該節點歷史區塊
(外部)交易接收 確認後 廣播出去 確認後 再廣播出去
(外部)交易詢問 回傳查詢資訊
(內部)交易廣播 確認後 廣播出去 確認後 再廣播出去
(內部)區塊廣播 計算後 廣播出去 確認後 再廣播出去

資料庫的應用與規劃

對於區塊鏈中的資料庫

對於需要在區塊鏈結點鐘建立的資料庫如下

  1. 區塊 資料庫
  2. UTXO 資料庫
  3. 區塊資訊 資料庫

區塊資料庫

在區塊鏈設計中
每個節點都應該要有一份區塊鏈資訊的備份

因此這個資料庫就是來儲存區塊的

而通常儲存區塊的方式 是採用 鍵值型(Key-Value)資料庫

資料庫型態
鍵(Key) 區塊哈希(BlockHash)
值(Value) 整個區塊資訊

因此透過此方式 就能從區塊哈希值 找到一個區塊

UTXO 資料庫

UTXO 全文是 Unspent Transaction Output
代表著未花費的輸出

其實邏輯上 就可以認為是紀錄該個帳戶有多錢的資料庫

有點像是銀行紀錄 一個帳戶有多少錢
不過並非是透過 直接多少錢紀錄

而是 紀錄是否之前有其他帳戶轉錢給當前帳戶且未花費
藉此推斷帳戶裡有多少餘額

資料庫型態
鍵(Key) 交易哈希(TransactionHash)
索引(Index) 索引
值(Value) 包含 地址、金額、已花費沒

區塊資訊 資料庫

會發現 透過上方區塊資料庫是無法得知最後一個區塊位置的

因此要再建一個資料庫紀錄其他關於區塊的訊息。

由此根據找到最後一區塊並開始機計算新的區塊。

區塊計算

區塊計算的程序規劃(5+N程序規劃)

首先對於區塊計算 先展示所需要的程序(平行運算程序)

(5+N程序規劃) 代表 5個基本程序 加上 N個礦工程序

主要想透過平行畫運算 大幅提升挖礦效率
有效發揮現代多核心CPU的運算效率

由上圖進行解釋

交易上:

資料出發點 資料內容 資料接收點
"廣播系統" 新的交易 "接收驗證交易"
- - -
"接收驗證交易" 驗證後 交易無誤後 廣播該筆交易 "廣播系統"
"接收驗證交易" 驗證後 交易無誤後 更新區塊交易 "刷新區塊"
- - -
"刷新區塊" 更新區塊內容 "礦工管理者"
- - -
"礦工管理者" 新的區塊 加 不同計算範圍 "礦工們"
- - -
"礦工們" 計算成功後 回傳成功區塊 "礦工管理者"

區塊上

資料出發點 資料內容 資料接收點
"礦工管理者" 傳送成功區塊 "接收驗證區塊"
"廣播系統" 新的區塊 "接收驗證區塊"
- - -
"接收驗證區塊" 驗證後 區塊無誤後 廣播該筆交易 "廣播系統"
"接收驗證區塊" 驗證後 區塊無誤後 更新區塊資料庫 "刷新資料庫"
- - -
"刷新資料庫" 更新區塊資料庫內容 "刷新區塊"
- - -
"刷新區塊" 更新區塊內容 "礦工管理者"
- - -
"礦工管理者" 新的區塊 加 不同計算範圍 "礦工們"

透過以上方式便能不斷接收 交易 或 區塊 進而去計算區塊鏈

共識機制的實現

在此在計算時 也必須符合共識機制的限制

因此 必須先限定 共識機制的內容

由此可以確認區塊鏈的在不同節點 共同性
(避免不同節點不同資訊)
以及對於分鏈的出現如何解決

提供上傳、查詢交易的接口

提供給使用者 一個方便的接口 非常重要

  • 使用者建立錢包(給予公鑰 私鑰)
  • 查詢自己的餘額
  • 建立交易
  • 對於交易進行簽名

系統架構規劃

透過以上設計
節點加入整體運作客戶端使用

從上方已能看到基本的雛型

首先來看系統架構圖(左方為建立礦工節點 右方為調動API)

再來實現上 則使用 Go 這門語言
(高效能、內建網路相關函式、輕鬆建立平行化程序)

最主要是採用是因為 goroutine 的設計
使要開發平行化程序 高效又輕鬆

專案架構組織

├── api               # 相關API撰寫位置
│   
├── database          # 資料庫相關事務
│   
├── protocal          # 節點建立、連線與溝通
│   
├── initalize         # 初始化
│   
├── service           # 5+N 相關程序
│   
├── block_structure   # 區塊架構
│   
├── utils             # 其餘相關輔助功能
│   
├── main.go           # 主程序

結言

哇 總算結束拉~~

可以感受得出來
區塊鏈的建立是件不簡單的事

難怪有人會說 中本聰(比特幣創始人) 是從未來穿越回來的

當然在此必須先說 像是許多區塊鏈程序碼都是開源的
邏輯上 不用重複造輪子 再自己寫(包括協定、共識等等)

但是我認為 與這技能是否能使用、是否有意義無關
而是單純想實際去撰寫一遍 才能更理解它的本質

希望看完這篇能理解

  1. 節點建立的要素
  2. 節點所需要哪些溝通
  3. 區塊鏈中傳輸協定是協定哪些東西
  4. 區塊鏈資料庫 要有哪些
  5. 礦工 計算區塊 要面臨的事物

下回預告

經過基本的規劃
想對於實現區塊鏈 應該是胸有成竹了吧?

應該吧? 哈哈哈哈 我講的也很心虛!

基本上就 Step by step 吧!

首先來面對 基本的區塊與鏈的結構

下回 "區塊鏈建立: 設定區塊與鏈"


上一篇
區塊鏈基礎 : 說說故事-區塊鏈的歷史
下一篇
區塊鏈建立: 設定區塊與鏈
系列文
從 區塊鏈 到 去中心化應用程式(DApp)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言